<!doctype html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8" />
    <title>dependency graph</title>
    <style>
      .node:active path,
.node:hover path,
.node.current path,
.node:active polygon,
.node:hover polygon,
.node.current polygon {
  stroke: fuchsia;
  stroke-width: 2;
}

.edge:active path,
.edge:hover path,
.edge.current path,
.edge:active ellipse,
.edge:hover ellipse,
.edge.current ellipse {
  stroke: url(#edgeGradient);
  stroke-width: 3;
  stroke-opacity: 1;
}

.edge:active polygon,
.edge:hover polygon,
.edge.current polygon {
  stroke: fuchsia;
  stroke-width: 3;
  fill: fuchsia;
  stroke-opacity: 1;
  fill-opacity: 1;
}

.edge:active text,
.edge:hover text {
  fill: fuchsia;
}

.cluster path {
  stroke-width: 3;
}

.cluster:active path,
.cluster:hover path {
  fill: #ffff0011;
}

div.hint {
  background-color: #000000aa;
  color: white;
  font-family: Arial, Helvetica, sans-serif;
  border-radius: 1rem;
  position: fixed;
  top: calc(50% - 4em);
  right: calc(50% - 10em);
  border: none;
  padding: 1em 3em 1em 1em;
}

.hint button {
  position: absolute;
  font-weight: bolder;
  right: 0.6em;
  top: 0.6em;
  color: inherit;
  background-color: inherit;
  border: 1px solid currentColor;
  border-radius: 1em;
  margin-left: 0.6em;
}

.hint a {
  color: inherit;
}

#button_help {
  color: white;
  background-color: #00000011;
  border-radius: 1em;
  position: fixed;
  top: 1em;
  right: 1em;
  font-size: 24pt;
  font-weight: bolder;
  width: 2em;
  height: 2em;
  border: none;
}

#button_help:hover {
  cursor: pointer;
  background-color: #00000077;
}

@media print {
  #button_help {
    display: none;
  }

  div.hint {
    display: none;
  }
}

    </style>
  </head>
  <body>
    <button id="button_help">?</button>
    <div id="hints" class="hint" style="display: none">
      <button id="close-hints">x</button>
      <span id="hint-text"></span>
      <ul>
        <li><b>Hover</b> - highlight</li>
        <li><b>Right-click</b> - pin highlight</li>
        <li><b>ESC</b> - clear</li>
      </ul>
    </div>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 14.0.2 (20251019.1705)
 -->
<!-- Title: dependency&#45;cruiser output Pages: 1 -->
<svg width="1240pt" height="581pt"
 viewBox="0.00 0.00 1240.00 581.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 577)">
<title>dependency&#45;cruiser output</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-577 1236,-577 1236,4 -4,4"/>
<!-- src/cli/actions.mts -->
<g id="node1" class="node">
<title>src/cli/actions.mts</title>
<g id="a_node1"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/cli/actions.mts" xlink:title="actions.mts">
<path fill="#ccffcc" stroke="black" d="M246.83,-102C246.83,-102 197.92,-102 197.92,-102 193.58,-102 189.25,-97.67 189.25,-93.33 189.25,-93.33 189.25,-84.67 189.25,-84.67 189.25,-80.33 193.58,-76 197.92,-76 197.92,-76 246.83,-76 246.83,-76 251.17,-76 255.5,-80.33 255.5,-84.67 255.5,-84.67 255.5,-93.33 255.5,-93.33 255.5,-97.67 251.17,-102 246.83,-102"/>
<text xml:space="preserve" text-anchor="start" x="209.62" y="-90.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/cli/</text>
<text xml:space="preserve" text-anchor="start" x="197.25" y="-81.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">actions.mts</text>
</a>
</g>
</g>
<!-- src/index&#45;node.mts -->
<g id="node2" class="node">
<title>src/index&#45;node.mts</title>
<g id="a_node2"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/index-node.mts" xlink:title="index&#45;node.mts">
<path fill="#ddfeff" stroke="black" d="M391.08,-102C391.08,-102 326.42,-102 326.42,-102 322.08,-102 317.75,-97.67 317.75,-93.33 317.75,-93.33 317.75,-84.67 317.75,-84.67 317.75,-80.33 322.08,-76 326.42,-76 326.42,-76 391.08,-76 391.08,-76 395.42,-76 399.75,-80.33 399.75,-84.67 399.75,-84.67 399.75,-93.33 399.75,-93.33 399.75,-97.67 395.42,-102 391.08,-102"/>
<text xml:space="preserve" text-anchor="start" x="351.62" y="-90.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/</text>
<text xml:space="preserve" text-anchor="start" x="325.75" y="-81.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">index&#45;node.mts</text>
</a>
</g>
</g>
<!-- src/cli/actions.mts&#45;&gt;src/index&#45;node.mts -->
<g id="edge1" class="edge">
<title>src/cli/actions.mts&#45;&gt;src/index&#45;node.mts</title>
<path fill="none" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" d="M255.74,-91.6C255.74,-91.6 308.42,-91.6 308.42,-91.6"/>
<polygon fill="#000000" fill-opacity="0.200000" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" points="308.42,-93.7 314.42,-91.6 308.42,-89.5 308.42,-93.7"/>
</g>
<!-- src/cli/cli&#45;types.d.mts -->
<g id="node3" class="node">
<title>src/cli/cli&#45;types.d.mts</title>
<g id="a_node3"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/cli/cli-types.d.mts" xlink:title="cli&#45;types.d.mts">
<path fill="#ccffcc" stroke="black" d="M389.58,-64C389.58,-64 327.92,-64 327.92,-64 323.58,-64 319.25,-59.67 319.25,-55.33 319.25,-55.33 319.25,-46.67 319.25,-46.67 319.25,-42.33 323.58,-38 327.92,-38 327.92,-38 389.58,-38 389.58,-38 393.92,-38 398.25,-42.33 398.25,-46.67 398.25,-46.67 398.25,-55.33 398.25,-55.33 398.25,-59.67 393.92,-64 389.58,-64"/>
<text xml:space="preserve" text-anchor="start" x="346" y="-52.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/cli/</text>
<text xml:space="preserve" text-anchor="start" x="327.25" y="-43.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">cli&#45;types.d.mts</text>
</a>
</g>
</g>
<!-- src/cli/actions.mts&#45;&gt;src/cli/cli&#45;types.d.mts -->
<g id="edge2" class="edge">
<title>src/cli/actions.mts&#45;&gt;src/cli/cli&#45;types.d.mts</title>
<path fill="none" stroke="#007700" stroke-opacity="0.466667" d="M255.96,-86.4C273.77,-86.4 292,-86.4 292,-86.4 292,-86.4 292,-59.67 292,-59.67 292,-59.67 311.25,-59.67 311.25,-59.67"/>
<polygon fill="none" stroke="#007700" stroke-opacity="0.466667" points="311.25,-61.77 317.25,-59.67 311.25,-57.57 311.25,-61.77"/>
</g>
<!-- src/cli/file&#45;name&#45;to&#45;stream.mts -->
<g id="node4" class="node">
<title>src/cli/file&#45;name&#45;to&#45;stream.mts</title>
<g id="a_node4"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/cli/file-name-to-stream.mts" xlink:title="file&#45;name&#45;to&#45;stream.mts">
<path fill="#ccffcc" stroke="black" d="M409.83,-140C409.83,-140 307.67,-140 307.67,-140 303.33,-140 299,-135.67 299,-131.33 299,-131.33 299,-122.67 299,-122.67 299,-118.33 303.33,-114 307.67,-114 307.67,-114 409.83,-114 409.83,-114 414.17,-114 418.5,-118.33 418.5,-122.67 418.5,-122.67 418.5,-131.33 418.5,-131.33 418.5,-135.67 414.17,-140 409.83,-140"/>
<text xml:space="preserve" text-anchor="start" x="346" y="-128.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/cli/</text>
<text xml:space="preserve" text-anchor="start" x="307" y="-119.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">file&#45;name&#45;to&#45;stream.mts</text>
</a>
</g>
</g>
<!-- src/cli/actions.mts&#45;&gt;src/cli/file&#45;name&#45;to&#45;stream.mts -->
<g id="edge3" class="edge">
<title>src/cli/actions.mts&#45;&gt;src/cli/file&#45;name&#45;to&#45;stream.mts</title>
<path fill="none" stroke="#007700" stroke-width="2" stroke-opacity="0.466667" d="M255.5,-96.8C280.32,-96.8 310,-96.8 310,-96.8 310,-96.8 310,-104.64 310,-104.64"/>
<polygon fill="#007700" fill-opacity="0.466667" stroke="#007700" stroke-width="2" stroke-opacity="0.466667" points="307.9,-104.64 310,-110.64 312.1,-104.64 307.9,-104.64"/>
</g>
<!-- src/version.mts -->
<g id="node7" class="node">
<title>src/version.mts</title>
<g id="a_node7"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/version.mts" xlink:title="version.mts">
<path fill="#ddfeff" stroke="black" d="M520.33,-172C520.33,-172 470.67,-172 470.67,-172 466.33,-172 462,-167.67 462,-163.33 462,-163.33 462,-154.67 462,-154.67 462,-150.33 466.33,-146 470.67,-146 470.67,-146 520.33,-146 520.33,-146 524.67,-146 529,-150.33 529,-154.67 529,-154.67 529,-163.33 529,-163.33 529,-167.67 524.67,-172 520.33,-172"/>
<text xml:space="preserve" text-anchor="start" x="488.38" y="-160.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/</text>
<text xml:space="preserve" text-anchor="start" x="470" y="-151.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">version.mts</text>
</a>
</g>
</g>
<!-- src/index&#45;node.mts&#45;&gt;src/version.mts -->
<g id="edge19" class="edge">
<title>src/index&#45;node.mts&#45;&gt;src/version.mts</title>
<path fill="none" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" d="M400.13,-93.43C426.98,-93.43 457,-93.43 457,-93.43 457,-93.43 457,-152.5 457,-152.5 457,-152.5 457.47,-152.5 457.47,-152.5"/>
<polygon fill="#000000" fill-opacity="0.200000" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" points="452.69,-154.6 458.69,-152.5 452.69,-150.4 452.69,-154.6"/>
</g>
<!-- src/options.mts -->
<g id="node11" class="node">
<title>src/options.mts</title>
<g id="a_node11"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/options.mts" xlink:title="options.mts">
<path fill="#ddfeff" stroke="black" d="M1193.71,-246C1193.71,-246 1144.79,-246 1144.79,-246 1140.46,-246 1136.12,-241.67 1136.12,-237.33 1136.12,-237.33 1136.12,-228.67 1136.12,-228.67 1136.12,-224.33 1140.46,-220 1144.79,-220 1144.79,-220 1193.71,-220 1193.71,-220 1198.04,-220 1202.38,-224.33 1202.38,-228.67 1202.38,-228.67 1202.38,-237.33 1202.38,-237.33 1202.38,-241.67 1198.04,-246 1193.71,-246"/>
<text xml:space="preserve" text-anchor="start" x="1162.12" y="-234.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/</text>
<text xml:space="preserve" text-anchor="start" x="1144.12" y="-225.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">options.mts</text>
</a>
</g>
</g>
<!-- src/index&#45;node.mts&#45;&gt;src/options.mts -->
<g id="edge15" class="edge">
<title>src/index&#45;node.mts&#45;&gt;src/options.mts</title>
<path fill="none" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" d="M400.03,-99.14C414.4,-99.14 427,-99.14 427,-99.14 427,-99.14 427,-223.25 427,-223.25 427,-223.25 1126.89,-223.25 1126.89,-223.25"/>
<polygon fill="#000000" fill-opacity="0.200000" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" points="1126.89,-225.35 1132.89,-223.25 1126.89,-221.15 1126.89,-225.35"/>
</g>
<!-- src/parse/index.mts -->
<g id="node13" class="node">
<title>src/parse/index.mts</title>
<g id="a_node13"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/parse/index.mts" xlink:title="index.mts">
<path fill="#ffccff" stroke="black" d="M515.83,-108C515.83,-108 475.17,-108 475.17,-108 470.83,-108 466.5,-103.67 466.5,-99.33 466.5,-99.33 466.5,-90.67 466.5,-90.67 466.5,-86.33 470.83,-82 475.17,-82 475.17,-82 515.83,-82 515.83,-82 520.17,-82 524.5,-86.33 524.5,-90.67 524.5,-90.67 524.5,-99.33 524.5,-99.33 524.5,-103.67 520.17,-108 515.83,-108"/>
<text xml:space="preserve" text-anchor="start" x="475.62" y="-96.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/parse/</text>
<text xml:space="preserve" text-anchor="start" x="474.5" y="-87.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">index.mts</text>
</a>
</g>
</g>
<!-- src/index&#45;node.mts&#45;&gt;src/parse/index.mts -->
<g id="edge16" class="edge">
<title>src/index&#45;node.mts&#45;&gt;src/parse/index.mts</title>
<path fill="none" stroke="#ff00ff" stroke-width="2" stroke-opacity="0.466667" d="M400.15,-87.71C400.15,-87.71 457.36,-87.71 457.36,-87.71"/>
<polygon fill="#ff00ff" fill-opacity="0.466667" stroke="#ff00ff" stroke-width="2" stroke-opacity="0.466667" points="457.36,-89.81 463.36,-87.71 457.36,-85.61 457.36,-89.81"/>
</g>
<!-- src/render/index&#45;node.mts -->
<g id="node14" class="node">
<title>src/render/index&#45;node.mts</title>
<g id="a_node14"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/render/index-node.mts" xlink:title="index&#45;node.mts">
<path fill="#ccccff" stroke="black" d="M527.83,-70C527.83,-70 463.17,-70 463.17,-70 458.83,-70 454.5,-65.67 454.5,-61.33 454.5,-61.33 454.5,-52.67 454.5,-52.67 454.5,-48.33 458.83,-44 463.17,-44 463.17,-44 527.83,-44 527.83,-44 532.17,-44 536.5,-48.33 536.5,-52.67 536.5,-52.67 536.5,-61.33 536.5,-61.33 536.5,-65.67 532.17,-70 527.83,-70"/>
<text xml:space="preserve" text-anchor="start" x="473.75" y="-58.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/render/</text>
<text xml:space="preserve" text-anchor="start" x="462.5" y="-49.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">index&#45;node.mts</text>
</a>
</g>
</g>
<!-- src/index&#45;node.mts&#45;&gt;src/render/index&#45;node.mts -->
<g id="edge17" class="edge">
<title>src/index&#45;node.mts&#45;&gt;src/render/index&#45;node.mts</title>
<path fill="none" stroke="#0000ff" stroke-width="2" stroke-opacity="0.466667" d="M400.1,-84.86C427.72,-84.86 459,-84.86 459,-84.86 459,-84.86 459,-79.3 459,-79.3"/>
<polygon fill="#0000ff" fill-opacity="0.466667" stroke="#0000ff" stroke-width="2" stroke-opacity="0.466667" points="461.1,-79.3 459,-73.3 456.9,-79.3 461.1,-79.3"/>
</g>
<!-- src/transform/desugar.mts -->
<g id="node15" class="node">
<title>src/transform/desugar.mts</title>
<g id="a_node15"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/transform/desugar.mts" xlink:title="desugar.mts">
<path fill="#ddfeff" stroke="black" d="M681.83,-201C681.83,-201 628.42,-201 628.42,-201 624.08,-201 619.75,-196.67 619.75,-192.33 619.75,-192.33 619.75,-183.67 619.75,-183.67 619.75,-179.33 624.08,-175 628.42,-175 628.42,-175 681.83,-175 681.83,-175 686.17,-175 690.5,-179.33 690.5,-183.67 690.5,-183.67 690.5,-192.33 690.5,-192.33 690.5,-196.67 686.17,-201 681.83,-201"/>
<text xml:space="preserve" text-anchor="start" x="627.75" y="-189.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/transform/</text>
<text xml:space="preserve" text-anchor="start" x="628.5" y="-180.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">desugar.mts</text>
</a>
</g>
</g>
<!-- src/index&#45;node.mts&#45;&gt;src/transform/desugar.mts -->
<g id="edge18" class="edge">
<title>src/index&#45;node.mts&#45;&gt;src/transform/desugar.mts</title>
<path fill="none" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" d="M400.09,-96.29C418.46,-96.29 436,-96.29 436,-96.29 436,-96.29 436,-183.75 436,-183.75 436,-183.75 610.4,-183.75 610.4,-183.75"/>
<polygon fill="#000000" fill-opacity="0.200000" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" points="610.4,-185.85 616.4,-183.75 610.4,-181.65 610.4,-185.85"/>
</g>
<!-- src/cli/attributes&#45;parser.mjs -->
<g id="node5" class="node">
<title>src/cli/attributes&#45;parser.mjs</title>
<g id="a_node5"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/cli/attributes-parser.mjs" xlink:title="attributes&#45;parser.mjs">
<polygon fill="#ccffcc" stroke="gray" points="411.75,-26 305.75,-26 305.75,0 411.75,0 411.75,-26"/>
<text xml:space="preserve" text-anchor="start" x="346" y="-14.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/cli/</text>
<text xml:space="preserve" text-anchor="start" x="313.75" y="-5.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">attributes&#45;parser.mjs</text>
</a>
</g>
</g>
<!-- src/cli/cli.mts -->
<g id="node6" class="node">
<title>src/cli/cli.mts</title>
<g id="a_node6"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/cli/cli.mts" xlink:title="cli.mts">
<path fill="#ccffcc" stroke="black" d="M137.08,-83C137.08,-83 100.42,-83 100.42,-83 96.08,-83 91.75,-78.67 91.75,-74.33 91.75,-74.33 91.75,-65.67 91.75,-65.67 91.75,-61.33 96.08,-57 100.42,-57 100.42,-57 137.08,-57 137.08,-57 141.42,-57 145.75,-61.33 145.75,-65.67 145.75,-65.67 145.75,-74.33 145.75,-74.33 145.75,-78.67 141.42,-83 137.08,-83"/>
<text xml:space="preserve" text-anchor="start" x="106" y="-71.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/cli/</text>
<text xml:space="preserve" text-anchor="start" x="104.5" y="-62.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">cli.mts</text>
</a>
</g>
</g>
<!-- src/cli/cli.mts&#45;&gt;src/cli/actions.mts -->
<g id="edge5" class="edge">
<title>src/cli/cli.mts&#45;&gt;src/cli/actions.mts</title>
<path fill="none" stroke="#007700" stroke-width="2" stroke-opacity="0.466667" d="M146.25,-79.5C146.25,-79.5 179.8,-79.5 179.8,-79.5"/>
<polygon fill="#007700" fill-opacity="0.466667" stroke="#007700" stroke-width="2" stroke-opacity="0.466667" points="179.8,-81.6 185.8,-79.5 179.8,-77.4 179.8,-81.6"/>
</g>
<!-- src/cli/cli.mts&#45;&gt;src/version.mts -->
<g id="edge4" class="edge">
<title>src/cli/cli.mts&#45;&gt;src/version.mts</title>
<path fill="none" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" d="M119,-83.13C119,-107.89 119,-159 119,-159 119,-159 452.73,-159 452.73,-159"/>
<polygon fill="#000000" fill-opacity="0.200000" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" points="452.73,-161.1 458.73,-159 452.73,-156.9 452.73,-161.1"/>
</g>
<!-- src/cli/normalize.mts -->
<g id="node8" class="node">
<title>src/cli/normalize.mts</title>
<g id="a_node8"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/cli/normalize.mts" xlink:title="normalize.mts">
<path fill="#ccffcc" stroke="black" d="M252.08,-26C252.08,-26 192.67,-26 192.67,-26 188.33,-26 184,-21.67 184,-17.33 184,-17.33 184,-8.67 184,-8.67 184,-4.33 188.33,0 192.67,0 192.67,0 252.08,0 252.08,0 256.42,0 260.75,-4.33 260.75,-8.67 260.75,-8.67 260.75,-17.33 260.75,-17.33 260.75,-21.67 256.42,-26 252.08,-26"/>
<text xml:space="preserve" text-anchor="start" x="209.62" y="-14.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/cli/</text>
<text xml:space="preserve" text-anchor="start" x="192" y="-5.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">normalize.mts</text>
</a>
</g>
</g>
<!-- src/cli/cli.mts&#45;&gt;src/cli/normalize.mts -->
<g id="edge6" class="edge">
<title>src/cli/cli.mts&#45;&gt;src/cli/normalize.mts</title>
<path fill="none" stroke="#007700" stroke-width="2" stroke-opacity="0.466667" d="M119,-56.78C119,-39.94 119,-13 119,-13 119,-13 174.56,-13 174.56,-13"/>
<polygon fill="#007700" fill-opacity="0.466667" stroke="#007700" stroke-width="2" stroke-opacity="0.466667" points="174.56,-15.1 180.56,-13 174.56,-10.9 174.56,-15.1"/>
</g>
<!-- src/cli/validations.mts -->
<g id="node9" class="node">
<title>src/cli/validations.mts</title>
<g id="a_node9"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/cli/validations.mts" xlink:title="validations.mts">
<path fill="#ccffcc" stroke="black" d="M254.33,-64C254.33,-64 190.42,-64 190.42,-64 186.08,-64 181.75,-59.67 181.75,-55.33 181.75,-55.33 181.75,-46.67 181.75,-46.67 181.75,-42.33 186.08,-38 190.42,-38 190.42,-38 254.33,-38 254.33,-38 258.67,-38 263,-42.33 263,-46.67 263,-46.67 263,-55.33 263,-55.33 263,-59.67 258.67,-64 254.33,-64"/>
<text xml:space="preserve" text-anchor="start" x="209.62" y="-52.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/cli/</text>
<text xml:space="preserve" text-anchor="start" x="189.75" y="-43.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">validations.mts</text>
</a>
</g>
</g>
<!-- src/cli/cli.mts&#45;&gt;src/cli/validations.mts -->
<g id="edge7" class="edge">
<title>src/cli/cli.mts&#45;&gt;src/cli/validations.mts</title>
<path fill="none" stroke="#007700" stroke-width="2" stroke-opacity="0.466667" d="M146.25,-60.5C146.25,-60.5 172.45,-60.5 172.45,-60.5"/>
<polygon fill="#007700" fill-opacity="0.466667" stroke="#007700" stroke-width="2" stroke-opacity="0.466667" points="172.45,-62.6 178.45,-60.5 172.45,-58.4 172.45,-62.6"/>
</g>
<!-- src/cli/normalize.mts&#45;&gt;src/cli/cli&#45;types.d.mts -->
<g id="edge11" class="edge">
<title>src/cli/normalize.mts&#45;&gt;src/cli/cli&#45;types.d.mts</title>
<path fill="none" stroke="#007700" stroke-opacity="0.466667" d="M260.97,-13C273.85,-13 285,-13 285,-13 285,-13 285,-42.33 285,-42.33 285,-42.33 311.34,-42.33 311.34,-42.33"/>
<polygon fill="none" stroke="#007700" stroke-opacity="0.466667" points="311.34,-44.43 317.34,-42.33 311.34,-40.23 311.34,-44.43"/>
</g>
<!-- src/cli/normalize.mts&#45;&gt;src/cli/attributes&#45;parser.mjs -->
<g id="edge10" class="edge">
<title>src/cli/normalize.mts&#45;&gt;src/cli/attributes&#45;parser.mjs</title>
<path fill="none" stroke="#007700" stroke-width="2" stroke-opacity="0.466667" d="M261.09,-6.5C261.09,-6.5 296.4,-6.5 296.4,-6.5"/>
<polygon fill="#007700" fill-opacity="0.466667" stroke="#007700" stroke-width="2" stroke-opacity="0.466667" points="296.4,-8.6 302.4,-6.5 296.4,-4.4 296.4,-8.6"/>
</g>
<!-- src/cli/normalize.mts&#45;&gt;src/options.mts -->
<g id="edge9" class="edge">
<title>src/cli/normalize.mts&#45;&gt;src/options.mts</title>
<path fill="none" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" d="M260.82,-19.5C266.23,-19.5 270,-19.5 270,-19.5 270,-19.5 270,-229.75 270,-229.75 270,-229.75 1126.61,-229.75 1126.61,-229.75"/>
<polygon fill="#000000" fill-opacity="0.200000" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" points="1126.61,-231.85 1132.61,-229.75 1126.61,-227.65 1126.61,-231.85"/>
</g>
<!-- src/cli/validations.mts&#45;&gt;src/index&#45;node.mts -->
<g id="edge12" class="edge">
<title>src/cli/validations.mts&#45;&gt;src/index&#45;node.mts</title>
<path fill="none" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" d="M263.5,-46.67C271.26,-46.67 277,-46.67 277,-46.67 277,-46.67 277,-81.2 277,-81.2 277,-81.2 308.37,-81.2 308.37,-81.2"/>
<polygon fill="#000000" fill-opacity="0.200000" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" points="308.37,-83.3 314.37,-81.2 308.37,-79.1 308.37,-83.3"/>
</g>
<!-- src/cli/validations.mts&#45;&gt;src/cli/cli&#45;types.d.mts -->
<g id="edge14" class="edge">
<title>src/cli/validations.mts&#45;&gt;src/cli/cli&#45;types.d.mts</title>
<path fill="none" stroke="#007700" stroke-opacity="0.466667" d="M263.29,-55.33C263.29,-55.33 311.29,-55.33 311.29,-55.33"/>
<polygon fill="none" stroke="#007700" stroke-opacity="0.466667" points="311.29,-57.43 317.29,-55.33 311.29,-53.23 311.29,-57.43"/>
</g>
<!-- src/cli/validations.mts&#45;&gt;src/cli/attributes&#45;parser.mjs -->
<g id="edge13" class="edge">
<title>src/cli/validations.mts&#45;&gt;src/cli/attributes&#45;parser.mjs</title>
<path fill="none" stroke="#007700" stroke-width="2" stroke-opacity="0.466667" d="M263.36,-51C287.76,-51 314,-51 314,-51 314,-51 314,-35.32 314,-35.32"/>
<polygon fill="#007700" fill-opacity="0.466667" stroke="#007700" stroke-width="2" stroke-opacity="0.466667" points="316.1,-35.32 314,-29.32 311.9,-35.32 316.1,-35.32"/>
</g>
<!-- src/cli/main.mts -->
<g id="node10" class="node">
<title>src/cli/main.mts</title>
<g id="a_node10"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/cli/main.mts" xlink:title="main.mts">
<path fill="#ccffcc" stroke="black" d="M47.08,-83C47.08,-83 8.67,-83 8.67,-83 4.33,-83 0,-78.67 0,-74.33 0,-74.33 0,-65.67 0,-65.67 0,-61.33 4.33,-57 8.67,-57 8.67,-57 47.08,-57 47.08,-57 51.42,-57 55.75,-61.33 55.75,-65.67 55.75,-65.67 55.75,-74.33 55.75,-74.33 55.75,-78.67 51.42,-83 47.08,-83"/>
<text xml:space="preserve" text-anchor="start" x="15.12" y="-71.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/cli/</text>
<text xml:space="preserve" text-anchor="start" x="8" y="-62.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">main.mts</text>
</a>
</g>
</g>
<!-- src/cli/main.mts&#45;&gt;src/cli/cli.mts -->
<g id="edge8" class="edge">
<title>src/cli/main.mts&#45;&gt;src/cli/cli.mts</title>
<path fill="none" stroke="#007700" stroke-width="2" stroke-opacity="0.466667" d="M56.13,-70C56.13,-70 82.42,-70 82.42,-70"/>
<polygon fill="#007700" fill-opacity="0.466667" stroke="#007700" stroke-width="2" stroke-opacity="0.466667" points="82.42,-72.1 88.42,-70 82.42,-67.9 82.42,-72.1"/>
</g>
<!-- src/counter.mts -->
<g id="node12" class="node">
<title>src/counter.mts</title>
<g id="a_node12"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/counter.mts" xlink:title="counter.mts">
<path fill="#ddfeff" stroke="black" d="M858.33,-201C858.33,-201 808.67,-201 808.67,-201 804.33,-201 800,-196.67 800,-192.33 800,-192.33 800,-183.67 800,-183.67 800,-179.33 804.33,-175 808.67,-175 808.67,-175 858.33,-175 858.33,-175 862.67,-175 867,-179.33 867,-183.67 867,-183.67 867,-192.33 867,-192.33 867,-196.67 862.67,-201 858.33,-201"/>
<text xml:space="preserve" text-anchor="start" x="826.38" y="-189.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/</text>
<text xml:space="preserve" text-anchor="start" x="808" y="-180.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">counter.mts</text>
</a>
</g>
</g>
<!-- src/parse/index.mts&#45;&gt;src/options.mts -->
<g id="edge25" class="edge">
<title>src/parse/index.mts&#45;&gt;src/options.mts</title>
<path fill="none" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" d="M524.87,-95C654.5,-95 1169,-95 1169,-95 1169,-95 1169,-210.49 1169,-210.49"/>
<polygon fill="#000000" fill-opacity="0.200000" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" points="1166.9,-210.49 1169,-216.49 1171.1,-210.49 1166.9,-210.49"/>
</g>
<!-- src/parse/scxml/index.mjs -->
<g id="node18" class="node">
<title>src/parse/scxml/index.mjs</title>
<g id="a_node18"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/parse/scxml/index.mjs" xlink:title="index.mjs">
<path fill="#ffccff" stroke="black" d="M687.08,-87C687.08,-87 623.17,-87 623.17,-87 618.83,-87 614.5,-82.67 614.5,-78.33 614.5,-78.33 614.5,-69.67 614.5,-69.67 614.5,-65.33 618.83,-61 623.17,-61 623.17,-61 687.08,-61 687.08,-61 691.42,-61 695.75,-65.33 695.75,-69.67 695.75,-69.67 695.75,-78.33 695.75,-78.33 695.75,-82.67 691.42,-87 687.08,-87"/>
<text xml:space="preserve" text-anchor="start" x="622.5" y="-75.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/parse/scxml/</text>
<text xml:space="preserve" text-anchor="start" x="634.5" y="-66.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">index.mjs</text>
</a>
</g>
</g>
<!-- src/parse/index.mts&#45;&gt;src/parse/scxml/index.mjs -->
<g id="edge26" class="edge">
<title>src/parse/index.mts&#45;&gt;src/parse/scxml/index.mjs</title>
<path fill="none" stroke="#ff00ff" stroke-width="2" stroke-dasharray="5,2" stroke-opacity="0.466667" d="M524.75,-91C570.8,-91 655,-91 655,-91 655,-91 655,-90.64 655,-90.64"/>
<polygon fill="#ff00ff" fill-opacity="0.466667" stroke="#ff00ff" stroke-width="2" stroke-opacity="0.466667" points="657.1,-96.42 655,-90.42 652.9,-96.42 657.1,-96.42"/>
</g>
<!-- src/parse/smcat&#45;ast.schema.mts -->
<g id="node19" class="node">
<title>src/parse/smcat&#45;ast.schema.mts</title>
<g id="a_node19"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/parse/smcat-ast.schema.mts" xlink:title="smcat&#45;ast.schema.mts">
<path fill="#ffccff" stroke="black" d="M703.96,-125C703.96,-125 606.29,-125 606.29,-125 601.96,-125 597.62,-120.67 597.62,-116.33 597.62,-116.33 597.62,-107.67 597.62,-107.67 597.62,-103.33 601.96,-99 606.29,-99 606.29,-99 703.96,-99 703.96,-99 708.29,-99 712.62,-103.33 712.62,-107.67 712.62,-107.67 712.62,-116.33 712.62,-116.33 712.62,-120.67 708.29,-125 703.96,-125"/>
<text xml:space="preserve" text-anchor="start" x="635.25" y="-113.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/parse/</text>
<text xml:space="preserve" text-anchor="start" x="605.62" y="-104.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">smcat&#45;ast.schema.mts</text>
</a>
</g>
</g>
<!-- src/parse/index.mts&#45;&gt;src/parse/smcat&#45;ast.schema.mts -->
<g id="edge27" class="edge">
<title>src/parse/index.mts&#45;&gt;src/parse/smcat&#45;ast.schema.mts</title>
<path fill="none" stroke="#ff00ff" stroke-width="2" stroke-opacity="0.466667" d="M524.78,-102C524.78,-102 588.23,-102 588.23,-102"/>
<polygon fill="#ff00ff" fill-opacity="0.466667" stroke="#ff00ff" stroke-width="2" stroke-opacity="0.466667" points="588.23,-104.1 594.23,-102 588.23,-99.9 588.23,-104.1"/>
</g>
<!-- src/parse/smcat/parse.mts -->
<g id="node20" class="node">
<title>src/parse/smcat/parse.mts</title>
<g id="a_node20"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/parse/smcat/parse.mts" xlink:title="parse.mts">
<path fill="#ffccff" stroke="black" d="M687.46,-163C687.46,-163 622.79,-163 622.79,-163 618.46,-163 614.12,-158.67 614.12,-154.33 614.12,-154.33 614.12,-145.67 614.12,-145.67 614.12,-141.33 618.46,-137 622.79,-137 622.79,-137 687.46,-137 687.46,-137 691.79,-137 696.12,-141.33 696.12,-145.67 696.12,-145.67 696.12,-154.33 696.12,-154.33 696.12,-158.67 691.79,-163 687.46,-163"/>
<text xml:space="preserve" text-anchor="start" x="622.12" y="-151.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/parse/smcat/</text>
<text xml:space="preserve" text-anchor="start" x="633.38" y="-142.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">parse.mts</text>
</a>
</g>
</g>
<!-- src/parse/index.mts&#45;&gt;src/parse/smcat/parse.mts -->
<g id="edge28" class="edge">
<title>src/parse/index.mts&#45;&gt;src/parse/smcat/parse.mts</title>
<path fill="none" stroke="#ff00ff" stroke-width="2" stroke-opacity="0.466667" d="M524.75,-105C539.38,-105 554,-105 554,-105 554,-105 554,-154.5 554,-154.5 554,-154.5 604.67,-154.5 604.67,-154.5"/>
<polygon fill="#ff00ff" fill-opacity="0.466667" stroke="#ff00ff" stroke-width="2" stroke-opacity="0.466667" points="604.67,-156.6 610.67,-154.5 604.67,-152.4 604.67,-156.6"/>
</g>
<!-- src/transform/desugar.mts&#45;&gt;src/counter.mts -->
<g id="edge63" class="edge">
<title>src/transform/desugar.mts&#45;&gt;src/counter.mts</title>
<path fill="none" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" d="M690.79,-195.8C690.79,-195.8 790.68,-195.8 790.68,-195.8"/>
<polygon fill="#000000" fill-opacity="0.200000" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" points="790.68,-197.9 796.68,-195.8 790.68,-193.7 790.68,-197.9"/>
</g>
<!-- src/state&#45;machine&#45;model.mts -->
<g id="node22" class="node">
<title>src/state&#45;machine&#45;model.mts</title>
<g id="a_node22"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/state-machine-model.mts" xlink:title="state&#45;machine&#45;model.mts">
<path fill="#ddfeff" stroke="black" d="M1223.33,-369C1223.33,-369 1115.17,-369 1115.17,-369 1110.83,-369 1106.5,-364.67 1106.5,-360.33 1106.5,-360.33 1106.5,-351.67 1106.5,-351.67 1106.5,-347.33 1110.83,-343 1115.17,-343 1115.17,-343 1223.33,-343 1223.33,-343 1227.67,-343 1232,-347.33 1232,-351.67 1232,-351.67 1232,-360.33 1232,-360.33 1232,-364.67 1227.67,-369 1223.33,-369"/>
<text xml:space="preserve" text-anchor="start" x="1162.12" y="-357.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/</text>
<text xml:space="preserve" text-anchor="start" x="1114.5" y="-348.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">state&#45;machine&#45;model.mts</text>
</a>
</g>
</g>
<!-- src/transform/desugar.mts&#45;&gt;src/state&#45;machine&#45;model.mts -->
<g id="edge64" class="edge">
<title>src/transform/desugar.mts&#45;&gt;src/state&#45;machine&#45;model.mts</title>
<path fill="none" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" d="M655,-201.4C655,-206.9 655,-212 655,-212 655,-212 1126,-212 1126,-212 1126,-212 1126,-333.68 1126,-333.68"/>
<polygon fill="#000000" fill-opacity="0.200000" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" points="1123.9,-333.68 1126,-339.68 1128.1,-333.68 1123.9,-333.68"/>
</g>
<!-- src/transform/utl.mts -->
<g id="node23" class="node">
<title>src/transform/utl.mts</title>
<g id="a_node23"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/transform/utl.mts" xlink:title="utl.mts">
<path fill="#ddfeff" stroke="black" d="M860.21,-125C860.21,-125 806.79,-125 806.79,-125 802.46,-125 798.12,-120.67 798.12,-116.33 798.12,-116.33 798.12,-107.67 798.12,-107.67 798.12,-103.33 802.46,-99 806.79,-99 806.79,-99 860.21,-99 860.21,-99 864.54,-99 868.88,-103.33 868.88,-107.67 868.88,-107.67 868.88,-116.33 868.88,-116.33 868.88,-120.67 864.54,-125 860.21,-125"/>
<text xml:space="preserve" text-anchor="start" x="806.12" y="-113.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/transform/</text>
<text xml:space="preserve" text-anchor="start" x="818.88" y="-104.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">utl.mts</text>
</a>
</g>
</g>
<!-- src/transform/desugar.mts&#45;&gt;src/transform/utl.mts -->
<g id="edge65" class="edge">
<title>src/transform/desugar.mts&#45;&gt;src/transform/utl.mts</title>
<path fill="none" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" d="M690.76,-185.4C706.28,-185.4 721,-185.4 721,-185.4 721,-185.4 721,-112 721,-112 721,-112 788.88,-112 788.88,-112"/>
<polygon fill="#000000" fill-opacity="0.200000" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" points="788.88,-114.1 794.88,-112 788.88,-109.9 788.88,-114.1"/>
</g>
<!-- src/index.mts -->
<g id="node16" class="node">
<title>src/index.mts</title>
<g id="a_node16"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/index.mts" xlink:title="index.mts">
<path fill="#ddfeff" stroke="black" d="M379.08,-204C379.08,-204 338.42,-204 338.42,-204 334.08,-204 329.75,-199.67 329.75,-195.33 329.75,-195.33 329.75,-186.67 329.75,-186.67 329.75,-182.33 334.08,-178 338.42,-178 338.42,-178 379.08,-178 379.08,-178 383.42,-178 387.75,-182.33 387.75,-186.67 387.75,-186.67 387.75,-195.33 387.75,-195.33 387.75,-199.67 383.42,-204 379.08,-204"/>
<text xml:space="preserve" text-anchor="start" x="351.62" y="-192.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/</text>
<text xml:space="preserve" text-anchor="start" x="337.75" y="-183.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">index.mts</text>
</a>
</g>
</g>
<!-- src/index.mts&#45;&gt;src/version.mts -->
<g id="edge24" class="edge">
<title>src/index.mts&#45;&gt;src/version.mts</title>
<path fill="none" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" d="M359,-177.65C359,-171.48 359,-165.5 359,-165.5 359,-165.5 452.73,-165.5 452.73,-165.5"/>
<polygon fill="#000000" fill-opacity="0.200000" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" points="452.73,-167.6 458.73,-165.5 452.73,-163.4 452.73,-167.6"/>
</g>
<!-- src/index.mts&#45;&gt;src/options.mts -->
<g id="edge20" class="edge">
<title>src/index.mts&#45;&gt;src/options.mts</title>
<path fill="none" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" d="M368,-204.22C368,-214.31 368,-226.5 368,-226.5 368,-226.5 1126.81,-226.5 1126.81,-226.5"/>
<polygon fill="#000000" fill-opacity="0.200000" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" points="1126.81,-228.6 1132.81,-226.5 1126.81,-224.4 1126.81,-228.6"/>
</g>
<!-- src/index.mts&#45;&gt;src/parse/index.mts -->
<g id="edge21" class="edge">
<title>src/index.mts&#45;&gt;src/parse/index.mts</title>
<path fill="none" stroke="#ff00ff" stroke-width="2" stroke-opacity="0.466667" d="M387.95,-189.5C412.97,-189.5 445,-189.5 445,-189.5 445,-189.5 445,-90.57 445,-90.57 445,-90.57 457.1,-90.57 457.1,-90.57"/>
<polygon fill="#ff00ff" fill-opacity="0.466667" stroke="#ff00ff" stroke-width="2" stroke-opacity="0.466667" points="457.1,-92.67 463.1,-90.57 457.1,-88.47 457.1,-92.67"/>
</g>
<!-- src/index.mts&#45;&gt;src/transform/desugar.mts -->
<g id="edge23" class="edge">
<title>src/index.mts&#45;&gt;src/transform/desugar.mts</title>
<path fill="none" stroke="#000000" stroke-opacity="0.200000" d="M387.98,-195.25C387.98,-195.25 611.75,-195.25 611.75,-195.25"/>
<polygon fill="none" stroke="#000000" stroke-opacity="0.200000" points="611.75,-197.35 617.75,-195.25 611.75,-193.15 611.75,-197.35"/>
</g>
<!-- src/render/index.mts -->
<g id="node17" class="node">
<title>src/render/index.mts</title>
<g id="a_node17"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/render/index.mts" xlink:title="index.mts">
<path fill="#ccccff" stroke="black" d="M516.58,-399C516.58,-399 474.42,-399 474.42,-399 470.08,-399 465.75,-394.67 465.75,-390.33 465.75,-390.33 465.75,-381.67 465.75,-381.67 465.75,-377.33 470.08,-373 474.42,-373 474.42,-373 516.58,-373 516.58,-373 520.92,-373 525.25,-377.33 525.25,-381.67 525.25,-381.67 525.25,-390.33 525.25,-390.33 525.25,-394.67 520.92,-399 516.58,-399"/>
<text xml:space="preserve" text-anchor="start" x="473.75" y="-387.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/render/</text>
<text xml:space="preserve" text-anchor="start" x="474.5" y="-378.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">index.mts</text>
</a>
</g>
</g>
<!-- src/index.mts&#45;&gt;src/render/index.mts -->
<g id="edge22" class="edge">
<title>src/index.mts&#45;&gt;src/render/index.mts</title>
<path fill="none" stroke="#0000ff" stroke-width="2" stroke-opacity="0.466667" d="M349,-204.4C349,-248.46 349,-386 349,-386 349,-386 456.47,-386 456.47,-386"/>
<polygon fill="#0000ff" fill-opacity="0.466667" stroke="#0000ff" stroke-width="2" stroke-opacity="0.466667" points="456.47,-388.1 462.47,-386 456.47,-383.9 456.47,-388.1"/>
</g>
<!-- src/render/dot/index.mts -->
<g id="node29" class="node">
<title>src/render/dot/index.mts</title>
<g id="a_node29"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/render/dot/index.mts" xlink:title="index.mts">
<path fill="#ccccff" stroke="black" d="M862.08,-368C862.08,-368 804.92,-368 804.92,-368 800.58,-368 796.25,-363.67 796.25,-359.33 796.25,-359.33 796.25,-350.67 796.25,-350.67 796.25,-346.33 800.58,-342 804.92,-342 804.92,-342 862.08,-342 862.08,-342 866.42,-342 870.75,-346.33 870.75,-350.67 870.75,-350.67 870.75,-359.33 870.75,-359.33 870.75,-363.67 866.42,-368 862.08,-368"/>
<text xml:space="preserve" text-anchor="start" x="804.25" y="-356.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/render/dot/</text>
<text xml:space="preserve" text-anchor="start" x="812.5" y="-347.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">index.mts</text>
</a>
</g>
</g>
<!-- src/render/index.mts&#45;&gt;src/render/dot/index.mts -->
<g id="edge46" class="edge">
<title>src/render/index.mts&#45;&gt;src/render/dot/index.mts</title>
<path fill="none" stroke="#0000ff" stroke-width="2" stroke-dasharray="5,2" stroke-opacity="0.466667" d="M505,-372.84C505,-362.8 505,-350.67 505,-350.67 505,-350.67 786.79,-350.67 786.79,-350.67"/>
<polygon fill="#0000ff" fill-opacity="0.466667" stroke="#0000ff" stroke-width="2" stroke-opacity="0.466667" points="786.79,-352.77 792.79,-350.67 786.79,-348.57 786.79,-352.77"/>
</g>
<!-- src/render/scjson/index.mts -->
<g id="node31" class="node">
<title>src/render/scjson/index.mts</title>
<g id="a_node31"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/render/scjson/index.mts" xlink:title="index.mts">
<path fill="#ccccff" stroke="black" d="M868.83,-500C868.83,-500 798.17,-500 798.17,-500 793.83,-500 789.5,-495.67 789.5,-491.33 789.5,-491.33 789.5,-482.67 789.5,-482.67 789.5,-478.33 793.83,-474 798.17,-474 798.17,-474 868.83,-474 868.83,-474 873.17,-474 877.5,-478.33 877.5,-482.67 877.5,-482.67 877.5,-491.33 877.5,-491.33 877.5,-495.67 873.17,-500 868.83,-500"/>
<text xml:space="preserve" text-anchor="start" x="797.5" y="-488.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/render/scjson/</text>
<text xml:space="preserve" text-anchor="start" x="812.5" y="-479.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">index.mts</text>
</a>
</g>
</g>
<!-- src/render/index.mts&#45;&gt;src/render/scjson/index.mts -->
<g id="edge47" class="edge">
<title>src/render/index.mts&#45;&gt;src/render/scjson/index.mts</title>
<path fill="none" stroke="#0000ff" stroke-width="2" stroke-dasharray="5,2" stroke-opacity="0.466667" d="M510,-399.44C510,-408.94 510,-420 510,-420 510,-420 819,-420 819,-420 819,-420 819,-464.74 819,-464.74"/>
<polygon fill="#0000ff" fill-opacity="0.466667" stroke="#0000ff" stroke-width="2" stroke-opacity="0.466667" points="816.9,-464.74 819,-470.74 821.1,-464.74 816.9,-464.74"/>
</g>
<!-- src/render/scxml/index.mts -->
<g id="node32" class="node">
<title>src/render/scxml/index.mts</title>
<g id="a_node32"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/render/scxml/index.mts" xlink:title="index.mts">
<path fill="#ccccff" stroke="black" d="M688.96,-501C688.96,-501 621.29,-501 621.29,-501 616.96,-501 612.62,-496.67 612.62,-492.33 612.62,-492.33 612.62,-483.67 612.62,-483.67 612.62,-479.33 616.96,-475 621.29,-475 621.29,-475 688.96,-475 688.96,-475 693.29,-475 697.62,-479.33 697.62,-483.67 697.62,-483.67 697.62,-492.33 697.62,-492.33 697.62,-496.67 693.29,-501 688.96,-501"/>
<text xml:space="preserve" text-anchor="start" x="620.62" y="-489.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/render/scxml/</text>
<text xml:space="preserve" text-anchor="start" x="634.12" y="-480.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">index.mts</text>
</a>
</g>
</g>
<!-- src/render/index.mts&#45;&gt;src/render/scxml/index.mts -->
<g id="edge48" class="edge">
<title>src/render/index.mts&#45;&gt;src/render/scxml/index.mts</title>
<path fill="none" stroke="#0000ff" stroke-width="2" stroke-dasharray="5,2" stroke-opacity="0.466667" d="M481,-399.33C481,-426.98 481,-488 481,-488 481,-488 603.5,-488 603.5,-488"/>
<polygon fill="#0000ff" fill-opacity="0.466667" stroke="#0000ff" stroke-width="2" stroke-opacity="0.466667" points="603.5,-490.1 609.5,-488 603.5,-485.9 603.5,-490.1"/>
</g>
<!-- src/render/smcat.mts -->
<g id="node33" class="node">
<title>src/render/smcat.mts</title>
<g id="a_node33"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/render/smcat.mts" xlink:title="smcat.mts">
<path fill="#ccccff" stroke="black" d="M677.33,-463C677.33,-463 632.92,-463 632.92,-463 628.58,-463 624.25,-458.67 624.25,-454.33 624.25,-454.33 624.25,-445.67 624.25,-445.67 624.25,-441.33 628.58,-437 632.92,-437 632.92,-437 677.33,-437 677.33,-437 681.67,-437 686,-441.33 686,-445.67 686,-445.67 686,-454.33 686,-454.33 686,-458.67 681.67,-463 677.33,-463"/>
<text xml:space="preserve" text-anchor="start" x="633.38" y="-451.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/render/</text>
<text xml:space="preserve" text-anchor="start" x="632.25" y="-442.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">smcat.mts</text>
</a>
</g>
</g>
<!-- src/render/index.mts&#45;&gt;src/render/smcat.mts -->
<g id="edge49" class="edge">
<title>src/render/index.mts&#45;&gt;src/render/smcat.mts</title>
<path fill="none" stroke="#0000ff" stroke-width="2" stroke-dasharray="5,2" stroke-opacity="0.466667" d="M495,-399.26C495,-418.01 495,-450 495,-450 495,-450 614.84,-450 614.84,-450"/>
<polygon fill="#0000ff" fill-opacity="0.466667" stroke="#0000ff" stroke-width="2" stroke-opacity="0.466667" points="614.84,-452.1 620.84,-450 614.84,-447.9 614.84,-452.1"/>
</g>
<!-- src/render/vector/vector&#45;with&#45;wasm.mts -->
<g id="node34" class="node">
<title>src/render/vector/vector&#45;with&#45;wasm.mts</title>
<g id="a_node34"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/render/vector/vector-with-wasm.mts" xlink:title="vector&#45;with&#45;wasm.mts">
<path fill="#ccccff" stroke="black" d="M702.08,-335C702.08,-335 608.17,-335 608.17,-335 603.83,-335 599.5,-330.67 599.5,-326.33 599.5,-326.33 599.5,-317.67 599.5,-317.67 599.5,-313.33 603.83,-309 608.17,-309 608.17,-309 702.08,-309 702.08,-309 706.42,-309 710.75,-313.33 710.75,-317.67 710.75,-317.67 710.75,-326.33 710.75,-326.33 710.75,-330.67 706.42,-335 702.08,-335"/>
<text xml:space="preserve" text-anchor="start" x="619.88" y="-323.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/render/vector/</text>
<text xml:space="preserve" text-anchor="start" x="607.5" y="-314.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">vector&#45;with&#45;wasm.mts</text>
</a>
</g>
</g>
<!-- src/render/index.mts&#45;&gt;src/render/vector/vector&#45;with&#45;wasm.mts -->
<g id="edge50" class="edge">
<title>src/render/index.mts&#45;&gt;src/render/vector/vector&#45;with&#45;wasm.mts</title>
<path fill="none" stroke="#0000ff" stroke-width="2" stroke-dasharray="5,2" stroke-opacity="0.466667" d="M486,-372.74C486,-353.99 486,-322 486,-322 486,-322 590.25,-322 590.25,-322"/>
<polygon fill="#0000ff" fill-opacity="0.466667" stroke="#0000ff" stroke-width="2" stroke-opacity="0.466667" points="590.25,-324.1 596.25,-322 590.25,-319.9 590.25,-324.1"/>
</g>
<!-- src/parse/scxml/index.mjs&#45;&gt;src/counter.mts -->
<g id="edge30" class="edge">
<title>src/parse/scxml/index.mjs&#45;&gt;src/counter.mts</title>
<path fill="none" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" d="M695.95,-83.5C713.04,-83.5 729,-83.5 729,-83.5 729,-83.5 729,-180.2 729,-180.2 729,-180.2 790.54,-180.2 790.54,-180.2"/>
<polygon fill="#000000" fill-opacity="0.200000" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" points="790.54,-182.3 796.54,-180.2 790.54,-178.1 790.54,-182.3"/>
</g>
<!-- src/parse/parser&#45;helpers.mts -->
<g id="node21" class="node">
<title>src/parse/parser&#45;helpers.mts</title>
<g id="a_node21"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/parse/parser-helpers.mts" xlink:title="parser&#45;helpers.mts">
<path fill="#ffccff" stroke="black" d="M1040.46,-163C1040.46,-163 959.29,-163 959.29,-163 954.96,-163 950.62,-158.67 950.62,-154.33 950.62,-154.33 950.62,-145.67 950.62,-145.67 950.62,-141.33 954.96,-137 959.29,-137 959.29,-137 1040.46,-137 1040.46,-137 1044.79,-137 1049.12,-141.33 1049.12,-145.67 1049.12,-145.67 1049.12,-154.33 1049.12,-154.33 1049.12,-158.67 1044.79,-163 1040.46,-163"/>
<text xml:space="preserve" text-anchor="start" x="980" y="-151.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/parse/</text>
<text xml:space="preserve" text-anchor="start" x="958.62" y="-142.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">parser&#45;helpers.mts</text>
</a>
</g>
</g>
<!-- src/parse/scxml/index.mjs&#45;&gt;src/parse/parser&#45;helpers.mts -->
<g id="edge32" class="edge">
<title>src/parse/scxml/index.mjs&#45;&gt;src/parse/parser&#45;helpers.mts</title>
<path fill="none" stroke="#ff00ff" stroke-width="2" stroke-opacity="0.466667" d="M696.19,-76.5C778.32,-76.5 955,-76.5 955,-76.5 955,-76.5 955,-127.49 955,-127.49"/>
<polygon fill="#ff00ff" fill-opacity="0.466667" stroke="#ff00ff" stroke-width="2" stroke-opacity="0.466667" points="952.9,-127.49 955,-133.49 957.1,-127.49 952.9,-127.49"/>
</g>
<!-- src/parse/scxml/index.mjs&#45;&gt;src/transform/utl.mts -->
<g id="edge31" class="edge">
<title>src/parse/scxml/index.mjs&#45;&gt;src/transform/utl.mts</title>
<path fill="none" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" d="M695.93,-80C748.45,-80 833,-80 833,-80 833,-80 833,-89.59 833,-89.59"/>
<polygon fill="#000000" fill-opacity="0.200000" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" points="830.9,-89.59 833,-95.59 835.1,-89.59 830.9,-89.59"/>
</g>
<!-- src/parse/scxml/normalize&#45;machine.mts -->
<g id="node24" class="node">
<title>src/parse/scxml/normalize&#45;machine.mts</title>
<g id="a_node24"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/parse/scxml/normalize-machine.mts" xlink:title="normalize&#45;machine.mts">
<path fill="#ffccff" stroke="black" d="M883.08,-61C883.08,-61 783.92,-61 783.92,-61 779.58,-61 775.25,-56.67 775.25,-52.33 775.25,-52.33 775.25,-43.67 775.25,-43.67 775.25,-39.33 779.58,-35 783.92,-35 783.92,-35 883.08,-35 883.08,-35 887.42,-35 891.75,-39.33 891.75,-43.67 891.75,-43.67 891.75,-52.33 891.75,-52.33 891.75,-56.67 887.42,-61 883.08,-61"/>
<text xml:space="preserve" text-anchor="start" x="800.88" y="-49.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/parse/scxml/</text>
<text xml:space="preserve" text-anchor="start" x="783.25" y="-40.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">normalize&#45;machine.mts</text>
</a>
</g>
</g>
<!-- src/parse/scxml/index.mjs&#45;&gt;src/parse/scxml/normalize&#45;machine.mts -->
<g id="edge33" class="edge">
<title>src/parse/scxml/index.mjs&#45;&gt;src/parse/scxml/normalize&#45;machine.mts</title>
<path fill="none" stroke="#ff00ff" stroke-width="2" stroke-opacity="0.466667" d="M695.99,-67C732.75,-67 781,-67 781,-67 781,-67 781,-66.44 781,-66.44"/>
<polygon fill="#ff00ff" fill-opacity="0.466667" stroke="#ff00ff" stroke-width="2" stroke-opacity="0.466667" points="783.1,-70.43 781,-64.43 778.9,-70.43 783.1,-70.43"/>
</g>
<!-- src/parse/scxml/utl.mts -->
<g id="node25" class="node">
<title>src/parse/scxml/utl.mts</title>
<g id="a_node25"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/parse/scxml/utl.mts" xlink:title="utl.mts">
<path fill="#ffccff" stroke="black" d="M1031.83,-35C1031.83,-35 967.92,-35 967.92,-35 963.58,-35 959.25,-30.67 959.25,-26.33 959.25,-26.33 959.25,-17.67 959.25,-17.67 959.25,-13.33 963.58,-9 967.92,-9 967.92,-9 1031.83,-9 1031.83,-9 1036.17,-9 1040.5,-13.33 1040.5,-17.67 1040.5,-17.67 1040.5,-26.33 1040.5,-26.33 1040.5,-30.67 1036.17,-35 1031.83,-35"/>
<text xml:space="preserve" text-anchor="start" x="967.25" y="-23.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/parse/scxml/</text>
<text xml:space="preserve" text-anchor="start" x="985.25" y="-14.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">utl.mts</text>
</a>
</g>
</g>
<!-- src/parse/scxml/index.mjs&#45;&gt;src/parse/scxml/utl.mts -->
<g id="edge34" class="edge">
<title>src/parse/scxml/index.mjs&#45;&gt;src/parse/scxml/utl.mts</title>
<path fill="none" stroke="#ff00ff" stroke-width="2" stroke-opacity="0.466667" d="M655,-60.71C655,-47.92 655,-30.5 655,-30.5 655,-30.5 949.93,-30.5 949.93,-30.5"/>
<polygon fill="#ff00ff" fill-opacity="0.466667" stroke="#ff00ff" stroke-width="2" stroke-opacity="0.466667" points="949.93,-32.6 955.93,-30.5 949.93,-28.4 949.93,-32.6"/>
</g>
<!-- src/parse/smcat/parse.mts&#45;&gt;src/counter.mts -->
<g id="edge37" class="edge">
<title>src/parse/smcat/parse.mts&#45;&gt;src/counter.mts</title>
<path fill="none" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" d="M696.58,-154.33C711.63,-154.33 725,-154.33 725,-154.33 725,-154.33 725,-190.6 725,-190.6 725,-190.6 790.74,-190.6 790.74,-190.6"/>
<polygon fill="#000000" fill-opacity="0.200000" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" points="790.74,-192.7 796.74,-190.6 790.74,-188.5 790.74,-192.7"/>
</g>
<!-- src/parse/smcat/smcat&#45;parser.mjs -->
<g id="node27" class="node">
<title>src/parse/smcat/smcat&#45;parser.mjs</title>
<g id="a_node27"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/parse/smcat/smcat-parser.mjs" xlink:title="smcat&#45;parser.mjs">
<polygon fill="#ffccff" stroke="gray" points="879.38,-163 787.62,-163 787.62,-137 879.38,-137 879.38,-163"/>
<text xml:space="preserve" text-anchor="start" x="800.5" y="-151.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/parse/smcat/</text>
<text xml:space="preserve" text-anchor="start" x="795.62" y="-142.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">smcat&#45;parser.mjs</text>
</a>
</g>
</g>
<!-- src/parse/smcat/parse.mts&#45;&gt;src/parse/smcat/smcat&#45;parser.mjs -->
<g id="edge38" class="edge">
<title>src/parse/smcat/parse.mts&#45;&gt;src/parse/smcat/smcat&#45;parser.mjs</title>
<path fill="none" stroke="#ff00ff" stroke-width="2" stroke-opacity="0.466667" d="M696.5,-145.67C696.5,-145.67 778.3,-145.67 778.3,-145.67"/>
<polygon fill="#ff00ff" fill-opacity="0.466667" stroke="#ff00ff" stroke-width="2" stroke-opacity="0.466667" points="778.3,-147.77 784.3,-145.67 778.3,-143.57 778.3,-147.77"/>
</g>
<!-- src/parse/parser&#45;helpers.mts&#45;&gt;src/state&#45;machine&#45;model.mts -->
<g id="edge29" class="edge">
<title>src/parse/parser&#45;helpers.mts&#45;&gt;src/state&#45;machine&#45;model.mts</title>
<path fill="none" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" d="M1043,-163.23C1043,-208.1 1043,-351.67 1043,-351.67 1043,-351.67 1097.1,-351.67 1097.1,-351.67"/>
<polygon fill="#000000" fill-opacity="0.200000" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" points="1097.1,-353.77 1103.1,-351.67 1097.1,-349.57 1097.1,-353.77"/>
</g>
<!-- src/parse/scxml/normalize&#45;machine.mts&#45;&gt;src/parse/scxml/utl.mts -->
<g id="edge36" class="edge">
<title>src/parse/scxml/normalize&#45;machine.mts&#45;&gt;src/parse/scxml/utl.mts</title>
<path fill="none" stroke="#ff00ff" stroke-width="2" stroke-opacity="0.466667" d="M892.2,-41C940.14,-41 1000,-41 1000,-41 1000,-41 1000,-40.44 1000,-40.44"/>
<polygon fill="#ff00ff" fill-opacity="0.466667" stroke="#ff00ff" stroke-width="2" stroke-opacity="0.466667" points="1002.1,-44.43 1000,-38.43 997.9,-44.43 1002.1,-44.43"/>
</g>
<!-- src/parse/scxml/scxml.d.ts -->
<g id="node26" class="node">
<title>src/parse/scxml/scxml.d.ts</title>
<g id="a_node26"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/parse/scxml/scxml.d.ts" xlink:title="scxml.d.ts">
<path fill="#ffccff" stroke="none" d="M1031.83,-73C1031.83,-73 967.92,-73 967.92,-73 963.58,-73 959.25,-68.67 959.25,-64.33 959.25,-64.33 959.25,-55.67 959.25,-55.67 959.25,-51.33 963.58,-47 967.92,-47 967.92,-47 1031.83,-47 1031.83,-47 1036.17,-47 1040.5,-51.33 1040.5,-55.67 1040.5,-55.67 1040.5,-64.33 1040.5,-64.33 1040.5,-68.67 1036.17,-73 1031.83,-73"/>
<text xml:space="preserve" text-anchor="start" x="967.25" y="-61.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/parse/scxml/</text>
<text xml:space="preserve" text-anchor="start" x="977.75" y="-52.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">scxml.d.ts</text>
</a>
</g>
</g>
<!-- src/parse/scxml/normalize&#45;machine.mts&#45;&gt;src/parse/scxml/scxml.d.ts -->
<g id="edge35" class="edge">
<title>src/parse/scxml/normalize&#45;machine.mts&#45;&gt;src/parse/scxml/scxml.d.ts</title>
<path fill="none" stroke="#ff00ff" stroke-opacity="0.466667" d="M892.16,-54C892.16,-54 951.45,-54 951.45,-54"/>
<polygon fill="none" stroke="#ff00ff" stroke-opacity="0.466667" points="951.45,-56.1 957.45,-54 951.45,-51.9 951.45,-56.1"/>
</g>
<!-- src/parse/smcat/smcat&#45;parser.mjs&#45;&gt;src/parse/parser&#45;helpers.mts -->
<g id="edge39" class="edge">
<title>src/parse/smcat/smcat&#45;parser.mjs&#45;&gt;src/parse/parser&#45;helpers.mts</title>
<path fill="none" stroke="#ff00ff" stroke-width="2" stroke-opacity="0.466667" d="M879.84,-150C879.84,-150 941.26,-150 941.26,-150"/>
<polygon fill="#ff00ff" fill-opacity="0.466667" stroke="#ff00ff" stroke-width="2" stroke-opacity="0.466667" points="941.26,-152.1 947.26,-150 941.26,-147.9 941.26,-152.1"/>
</g>
<!-- src/render/dot/attributebuilder.mts -->
<g id="node28" class="node">
<title>src/render/dot/attributebuilder.mts</title>
<g id="a_node28"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/render/dot/attributebuilder.mts" xlink:title="attributebuilder.mts">
<path fill="#ccccff" stroke="black" d="M1040.83,-433C1040.83,-433 958.92,-433 958.92,-433 954.58,-433 950.25,-428.67 950.25,-424.33 950.25,-424.33 950.25,-415.67 950.25,-415.67 950.25,-411.33 954.58,-407 958.92,-407 958.92,-407 1040.83,-407 1040.83,-407 1045.17,-407 1049.5,-411.33 1049.5,-415.67 1049.5,-415.67 1049.5,-424.33 1049.5,-424.33 1049.5,-428.67 1045.17,-433 1040.83,-433"/>
<text xml:space="preserve" text-anchor="start" x="970.62" y="-421.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/render/dot/</text>
<text xml:space="preserve" text-anchor="start" x="958.25" y="-412.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">attributebuilder.mts</text>
</a>
</g>
</g>
<!-- src/render/dot/index.mts&#45;&gt;src/options.mts -->
<g id="edge40" class="edge">
<title>src/render/dot/index.mts&#45;&gt;src/options.mts</title>
<path fill="none" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" d="M833,-341.75C833,-311.41 833,-239.5 833,-239.5 833,-239.5 1126.75,-239.5 1126.75,-239.5"/>
<polygon fill="#000000" fill-opacity="0.200000" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" points="1126.75,-241.6 1132.75,-239.5 1126.75,-237.4 1126.75,-241.6"/>
</g>
<!-- src/render/dot/index.mts&#45;&gt;src/state&#45;machine&#45;model.mts -->
<g id="edge41" class="edge">
<title>src/render/dot/index.mts&#45;&gt;src/state&#45;machine&#45;model.mts</title>
<path fill="none" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" d="M850,-341.68C850,-339.81 850,-338.5 850,-338.5 850,-338.5 1116,-338.5 1116,-338.5 1116,-338.5 1116,-338.91 1116,-338.91"/>
<polygon fill="#000000" fill-opacity="0.200000" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" points="1113.9,-333.53 1116,-339.53 1118.1,-333.53 1113.9,-333.53"/>
</g>
<!-- src/render/dot/index.mts&#45;&gt;src/render/dot/attributebuilder.mts -->
<g id="edge42" class="edge">
<title>src/render/dot/index.mts&#45;&gt;src/render/dot/attributebuilder.mts</title>
<path fill="none" stroke="#0000ff" stroke-width="2" stroke-opacity="0.466667" d="M871.23,-359.67C907.54,-359.67 957,-359.67 957,-359.67 957,-359.67 957,-397.58 957,-397.58"/>
<polygon fill="#0000ff" fill-opacity="0.466667" stroke="#0000ff" stroke-width="2" stroke-opacity="0.466667" points="954.9,-397.58 957,-403.58 959.1,-397.58 954.9,-397.58"/>
</g>
<!-- src/render/dot/utl.mts -->
<g id="node30" class="node">
<title>src/render/dot/utl.mts</title>
<g id="a_node30"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/render/dot/utl.mts" xlink:title="utl.mts">
<path fill="#ccccff" stroke="black" d="M1028.46,-369C1028.46,-369 971.29,-369 971.29,-369 966.96,-369 962.62,-364.67 962.62,-360.33 962.62,-360.33 962.62,-351.67 962.62,-351.67 962.62,-347.33 966.96,-343 971.29,-343 971.29,-343 1028.46,-343 1028.46,-343 1032.79,-343 1037.12,-347.33 1037.12,-351.67 1037.12,-351.67 1037.12,-360.33 1037.12,-360.33 1037.12,-364.67 1032.79,-369 1028.46,-369"/>
<text xml:space="preserve" text-anchor="start" x="970.62" y="-357.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/render/dot/</text>
<text xml:space="preserve" text-anchor="start" x="985.25" y="-348.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">utl.mts</text>
</a>
</g>
</g>
<!-- src/render/dot/index.mts&#45;&gt;src/render/dot/utl.mts -->
<g id="edge43" class="edge">
<title>src/render/dot/index.mts&#45;&gt;src/render/dot/utl.mts</title>
<path fill="none" stroke="#0000ff" stroke-width="2" stroke-opacity="0.466667" d="M870.84,-351.33C870.84,-351.33 953.35,-351.33 953.35,-351.33"/>
<polygon fill="#0000ff" fill-opacity="0.466667" stroke="#0000ff" stroke-width="2" stroke-opacity="0.466667" points="953.35,-353.43 959.35,-351.33 953.35,-349.23 953.35,-353.43"/>
</g>
<!-- src/render/dot/utl.mts&#45;&gt;src/options.mts -->
<g id="edge44" class="edge">
<title>src/render/dot/utl.mts&#45;&gt;src/options.mts</title>
<path fill="none" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" d="M1000,-342.56C1000,-312.57 1000,-242.75 1000,-242.75 1000,-242.75 1126.78,-242.75 1126.78,-242.75"/>
<polygon fill="#000000" fill-opacity="0.200000" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" points="1126.78,-244.85 1132.78,-242.75 1126.78,-240.65 1126.78,-244.85"/>
</g>
<!-- src/render/dot/utl.mts&#45;&gt;src/state&#45;machine&#45;model.mts -->
<g id="edge45" class="edge">
<title>src/render/dot/utl.mts&#45;&gt;src/state&#45;machine&#45;model.mts</title>
<path fill="none" stroke="#000000" stroke-opacity="0.200000" d="M1037.46,-360.33C1037.46,-360.33 1098.63,-360.33 1098.63,-360.33"/>
<polygon fill="none" stroke="#000000" stroke-opacity="0.200000" points="1098.63,-362.43 1104.63,-360.33 1098.63,-358.23 1098.63,-362.43"/>
</g>
<!-- src/render/scjson/index.mts&#45;&gt;src/state&#45;machine&#45;model.mts -->
<g id="edge51" class="edge">
<title>src/render/scjson/index.mts&#45;&gt;src/state&#45;machine&#45;model.mts</title>
<path fill="none" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" d="M848,-473.77C848,-470.05 848,-467 848,-467 848,-467 1169,-467 1169,-467 1169,-467 1169,-378.2 1169,-378.2"/>
<polygon fill="#000000" fill-opacity="0.200000" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" points="1171.1,-378.2 1169,-372.2 1166.9,-378.2 1171.1,-378.2"/>
</g>
<!-- src/render/scjson/make&#45;valid&#45;event&#45;names.mts -->
<g id="node35" class="node">
<title>src/render/scjson/make&#45;valid&#45;event&#45;names.mts</title>
<g id="a_node35"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/render/scjson/make-valid-event-names.mts" xlink:title="make&#45;valid&#45;event&#45;names.mts">
<path fill="#ccccff" stroke="black" d="M1061.83,-497C1061.83,-497 937.92,-497 937.92,-497 933.58,-497 929.25,-492.67 929.25,-488.33 929.25,-488.33 929.25,-479.67 929.25,-479.67 929.25,-475.33 933.58,-471 937.92,-471 937.92,-471 1061.83,-471 1061.83,-471 1066.17,-471 1070.5,-475.33 1070.5,-479.67 1070.5,-479.67 1070.5,-488.33 1070.5,-488.33 1070.5,-492.67 1066.17,-497 1061.83,-497"/>
<text xml:space="preserve" text-anchor="start" x="963.88" y="-485.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/render/scjson/</text>
<text xml:space="preserve" text-anchor="start" x="937.25" y="-476.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">make&#45;valid&#45;event&#45;names.mts</text>
</a>
</g>
</g>
<!-- src/render/scjson/index.mts&#45;&gt;src/render/scjson/make&#45;valid&#45;event&#45;names.mts -->
<g id="edge52" class="edge">
<title>src/render/scjson/index.mts&#45;&gt;src/render/scjson/make&#45;valid&#45;event&#45;names.mts</title>
<path fill="none" stroke="#0000ff" stroke-width="2" stroke-opacity="0.466667" d="M877.65,-481.67C877.65,-481.67 919.77,-481.67 919.77,-481.67"/>
<polygon fill="#0000ff" fill-opacity="0.466667" stroke="#0000ff" stroke-width="2" stroke-opacity="0.466667" points="919.77,-483.77 925.77,-481.67 919.77,-479.57 919.77,-483.77"/>
</g>
<!-- src/render/scjson/make&#45;valid&#45;xml&#45;name.mts -->
<g id="node36" class="node">
<title>src/render/scjson/make&#45;valid&#45;xml&#45;name.mts</title>
<g id="a_node36"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/render/scjson/make-valid-xml-name.mts" xlink:title="make&#45;valid&#45;xml&#45;name.mts">
<path fill="#ccccff" stroke="black" d="M1055.08,-535C1055.08,-535 944.67,-535 944.67,-535 940.33,-535 936,-530.67 936,-526.33 936,-526.33 936,-517.67 936,-517.67 936,-513.33 940.33,-509 944.67,-509 944.67,-509 1055.08,-509 1055.08,-509 1059.42,-509 1063.75,-513.33 1063.75,-517.67 1063.75,-517.67 1063.75,-526.33 1063.75,-526.33 1063.75,-530.67 1059.42,-535 1055.08,-535"/>
<text xml:space="preserve" text-anchor="start" x="963.88" y="-523.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/render/scjson/</text>
<text xml:space="preserve" text-anchor="start" x="944" y="-514.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">make&#45;valid&#45;xml&#45;name.mts</text>
</a>
</g>
</g>
<!-- src/render/scjson/index.mts&#45;&gt;src/render/scjson/make&#45;valid&#45;xml&#45;name.mts -->
<g id="edge53" class="edge">
<title>src/render/scjson/index.mts&#45;&gt;src/render/scjson/make&#45;valid&#45;xml&#45;name.mts</title>
<path fill="none" stroke="#0000ff" stroke-width="2" stroke-opacity="0.466667" d="M833,-500.39C833,-509.15 833,-519 833,-519 833,-519 926.81,-519 926.81,-519"/>
<polygon fill="#0000ff" fill-opacity="0.466667" stroke="#0000ff" stroke-width="2" stroke-opacity="0.466667" points="926.81,-521.1 932.81,-519 926.81,-516.9 926.81,-521.1"/>
</g>
<!-- src/render/scjson/scjson.d.ts -->
<g id="node37" class="node">
<title>src/render/scjson/scjson.d.ts</title>
<g id="a_node37"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/render/scjson/scjson.d.ts" xlink:title="scjson.d.ts">
<path fill="#ccccff" stroke="none" d="M1035.21,-573C1035.21,-573 964.54,-573 964.54,-573 960.21,-573 955.88,-568.67 955.88,-564.33 955.88,-564.33 955.88,-555.67 955.88,-555.67 955.88,-551.33 960.21,-547 964.54,-547 964.54,-547 1035.21,-547 1035.21,-547 1039.54,-547 1043.88,-551.33 1043.88,-555.67 1043.88,-555.67 1043.88,-564.33 1043.88,-564.33 1043.88,-568.67 1039.54,-573 1035.21,-573"/>
<text xml:space="preserve" text-anchor="start" x="963.88" y="-561.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/render/scjson/</text>
<text xml:space="preserve" text-anchor="start" x="976.62" y="-552.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">scjson.d.ts</text>
</a>
</g>
</g>
<!-- src/render/scjson/index.mts&#45;&gt;src/render/scjson/scjson.d.ts -->
<g id="edge54" class="edge">
<title>src/render/scjson/index.mts&#45;&gt;src/render/scjson/scjson.d.ts</title>
<path fill="none" stroke="#0000ff" stroke-opacity="0.466667" d="M877.68,-489.33C895.09,-489.33 911,-489.33 911,-489.33 911,-489.33 911,-549.67 911,-549.67 911,-549.67 947.92,-549.67 947.92,-549.67"/>
<polygon fill="none" stroke="#0000ff" stroke-opacity="0.466667" points="947.92,-551.77 953.92,-549.67 947.92,-547.57 947.92,-551.77"/>
</g>
<!-- src/render/scxml/index.mts&#45;&gt;src/render/scjson/index.mts -->
<g id="edge55" class="edge">
<title>src/render/scxml/index.mts&#45;&gt;src/render/scjson/index.mts</title>
<path fill="none" stroke="#0000ff" stroke-width="2" stroke-opacity="0.466667" d="M697.85,-483.33C697.85,-483.33 780.23,-483.33 780.23,-483.33"/>
<polygon fill="#0000ff" fill-opacity="0.466667" stroke="#0000ff" stroke-width="2" stroke-opacity="0.466667" points="780.23,-485.43 786.23,-483.33 780.23,-481.23 780.23,-485.43"/>
</g>
<!-- src/render/scxml/render&#45;from&#45;scjson.mts -->
<g id="node38" class="node">
<title>src/render/scxml/render&#45;from&#45;scjson.mts</title>
<g id="a_node38"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/render/scxml/render-from-scjson.mts" xlink:title="render&#45;from&#45;scjson.mts">
<path fill="#ccccff" stroke="black" d="M883.83,-555C883.83,-555 783.17,-555 783.17,-555 778.83,-555 774.5,-550.67 774.5,-546.33 774.5,-546.33 774.5,-537.67 774.5,-537.67 774.5,-533.33 778.83,-529 783.17,-529 783.17,-529 883.83,-529 883.83,-529 888.17,-529 892.5,-533.33 892.5,-537.67 892.5,-537.67 892.5,-546.33 892.5,-546.33 892.5,-550.67 888.17,-555 883.83,-555"/>
<text xml:space="preserve" text-anchor="start" x="799" y="-543.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/render/scxml/</text>
<text xml:space="preserve" text-anchor="start" x="782.5" y="-534.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">render&#45;from&#45;scjson.mts</text>
</a>
</g>
</g>
<!-- src/render/scxml/index.mts&#45;&gt;src/render/scxml/render&#45;from&#45;scjson.mts -->
<g id="edge56" class="edge">
<title>src/render/scxml/index.mts&#45;&gt;src/render/scxml/render&#45;from&#45;scjson.mts</title>
<path fill="none" stroke="#0000ff" stroke-width="2" stroke-opacity="0.466667" d="M698.08,-491.67C734.89,-491.67 782,-491.67 782,-491.67 782,-491.67 782,-519.48 782,-519.48"/>
<polygon fill="#0000ff" fill-opacity="0.466667" stroke="#0000ff" stroke-width="2" stroke-opacity="0.466667" points="779.9,-519.48 782,-525.48 784.1,-519.48 779.9,-519.48"/>
</g>
<!-- src/render/vector/vector&#45;with&#45;wasm.mts&#45;&gt;src/options.mts -->
<g id="edge61" class="edge">
<title>src/render/vector/vector&#45;with&#45;wasm.mts&#45;&gt;src/options.mts</title>
<path fill="none" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" d="M703,-308.87C703,-284.11 703,-233 703,-233 703,-233 1126.69,-233 1126.69,-233"/>
<polygon fill="#000000" fill-opacity="0.200000" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" points="1126.69,-235.1 1132.69,-233 1126.69,-230.9 1126.69,-235.1"/>
</g>
<!-- src/render/vector/vector&#45;with&#45;wasm.mts&#45;&gt;src/render/dot/index.mts -->
<g id="edge62" class="edge">
<title>src/render/vector/vector&#45;with&#45;wasm.mts&#45;&gt;src/render/dot/index.mts</title>
<path fill="none" stroke="#0000ff" stroke-width="2" stroke-opacity="0.466667" d="M710.83,-322C757.66,-322 817,-322 817,-322 817,-322 817,-332.55 817,-332.55"/>
<polygon fill="#0000ff" fill-opacity="0.466667" stroke="#0000ff" stroke-width="2" stroke-opacity="0.466667" points="814.9,-332.55 817,-338.55 819.1,-332.55 814.9,-332.55"/>
</g>
<!-- src/render/scxml/render&#45;from&#45;scjson.mts&#45;&gt;src/render/scjson/scjson.d.ts -->
<g id="edge57" class="edge">
<title>src/render/scxml/render&#45;from&#45;scjson.mts&#45;&gt;src/render/scjson/scjson.d.ts</title>
<path fill="none" stroke="#0000ff" stroke-opacity="0.466667" d="M892.63,-552.33C892.63,-552.33 948.07,-552.33 948.07,-552.33"/>
<polygon fill="none" stroke="#0000ff" stroke-opacity="0.466667" points="948.07,-554.43 954.07,-552.33 948.07,-550.23 948.07,-554.43"/>
</g>
<!-- src/render/vector/dot&#45;to&#45;vector&#45;native.mts -->
<g id="node39" class="node">
<title>src/render/vector/dot&#45;to&#45;vector&#45;native.mts</title>
<g id="a_node39"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/render/vector/dot-to-vector-native.mts" xlink:title="dot&#45;to&#45;vector&#45;native.mts">
<path fill="#ccccff" stroke="black" d="M884.58,-406C884.58,-406 782.42,-406 782.42,-406 778.08,-406 773.75,-401.67 773.75,-397.33 773.75,-397.33 773.75,-388.67 773.75,-388.67 773.75,-384.33 778.08,-380 782.42,-380 782.42,-380 884.58,-380 884.58,-380 888.92,-380 893.25,-384.33 893.25,-388.67 893.25,-388.67 893.25,-397.33 893.25,-397.33 893.25,-401.67 888.92,-406 884.58,-406"/>
<text xml:space="preserve" text-anchor="start" x="798.25" y="-394.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/render/vector/</text>
<text xml:space="preserve" text-anchor="start" x="781.75" y="-385.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">dot&#45;to&#45;vector&#45;native.mts</text>
</a>
</g>
</g>
<!-- src/render/vector/vector&#45;native&#45;dot&#45;with&#45;fallback.mts -->
<g id="node40" class="node">
<title>src/render/vector/vector&#45;native&#45;dot&#45;with&#45;fallback.mts</title>
<g id="a_node40"><a xlink:href="https://github.com/sverweij/state-machine-cat/blob/main/src/render/vector/vector-native-dot-with-fallback.mts" xlink:title="vector&#45;native&#45;dot&#45;with&#45;fallback.mts">
<path fill="#ccccff" stroke="black" d="M729.08,-399C729.08,-399 581.17,-399 581.17,-399 576.83,-399 572.5,-394.67 572.5,-390.33 572.5,-390.33 572.5,-381.67 572.5,-381.67 572.5,-377.33 576.83,-373 581.17,-373 581.17,-373 729.08,-373 729.08,-373 733.42,-373 737.75,-377.33 737.75,-381.67 737.75,-381.67 737.75,-390.33 737.75,-390.33 737.75,-394.67 733.42,-399 729.08,-399"/>
<text xml:space="preserve" text-anchor="start" x="619.88" y="-387.45" font-family="Helvetica,sans-Serif" font-size="9.00">src/render/vector/</text>
<text xml:space="preserve" text-anchor="start" x="580.5" y="-378.45" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="9.00">vector&#45;native&#45;dot&#45;with&#45;fallback.mts</text>
</a>
</g>
</g>
<!-- src/render/vector/vector&#45;native&#45;dot&#45;with&#45;fallback.mts&#45;&gt;src/options.mts -->
<g id="edge58" class="edge">
<title>src/render/vector/vector&#45;native&#45;dot&#45;with&#45;fallback.mts&#45;&gt;src/options.mts</title>
<path fill="none" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" d="M717,-372.71C717,-336.06 717,-236.25 717,-236.25 717,-236.25 1126.6,-236.25 1126.6,-236.25"/>
<polygon fill="#000000" fill-opacity="0.200000" stroke="#000000" stroke-width="2" stroke-opacity="0.200000" points="1126.6,-238.35 1132.6,-236.25 1126.6,-234.15 1126.6,-238.35"/>
</g>
<!-- src/render/vector/vector&#45;native&#45;dot&#45;with&#45;fallback.mts&#45;&gt;src/render/dot/index.mts -->
<g id="edge59" class="edge">
<title>src/render/vector/vector&#45;native&#45;dot&#45;with&#45;fallback.mts&#45;&gt;src/render/dot/index.mts</title>
<path fill="none" stroke="#0000ff" stroke-width="2" stroke-opacity="0.466667" d="M734,-372.67C734,-366 734,-359.33 734,-359.33 734,-359.33 786.86,-359.33 786.86,-359.33"/>
<polygon fill="#0000ff" fill-opacity="0.466667" stroke="#0000ff" stroke-width="2" stroke-opacity="0.466667" points="786.86,-361.43 792.86,-359.33 786.86,-357.23 786.86,-361.43"/>
</g>
<!-- src/render/vector/vector&#45;native&#45;dot&#45;with&#45;fallback.mts&#45;&gt;src/render/vector/dot&#45;to&#45;vector&#45;native.mts -->
<g id="edge60" class="edge">
<title>src/render/vector/vector&#45;native&#45;dot&#45;with&#45;fallback.mts&#45;&gt;src/render/vector/dot&#45;to&#45;vector&#45;native.mts</title>
<path fill="none" stroke="#0000ff" stroke-width="2" stroke-opacity="0.466667" d="M738.05,-389.5C738.05,-389.5 764.37,-389.5 764.37,-389.5"/>
<polygon fill="#0000ff" fill-opacity="0.466667" stroke="#0000ff" stroke-width="2" stroke-opacity="0.466667" points="764.37,-391.6 770.37,-389.5 764.37,-387.4 764.37,-391.6"/>
</g>
</g>
</svg>
    <script>
      var gMode = new Mode();

var title2ElementMap = (function makeElementMap() {
  /** @type {NodeListOf<SVGGElement>} */
  var nodes = document.querySelectorAll(".node");
  /** @type {NodeListOf<SVGGElement>} */
  var edges = document.querySelectorAll(".edge");
  return new Title2ElementMap(edges, nodes);
})();

function getHoverHandler(pTitle2ElementMap) {
  /** @type {string} */
  var currentHighlightedTitle = "";

  /** @param {MouseEvent} pMouseEvent */
  return function hoverHighlightHandler(pMouseEvent) {
    var closestNodeOrEdge = pMouseEvent.target.closest(".edge, .node");
    var closestTitleText = getTitleText(closestNodeOrEdge);

    if (
      currentHighlightedTitle !== closestTitleText &&
      gMode.get() === gMode.HOVER
    ) {
      resetNodesAndEdges();
      addHighlight(closestNodeOrEdge);
      pTitle2ElementMap.get(closestTitleText).forEach(addHighlight);
      currentHighlightedTitle = closestTitleText;
    }
  };
}

function getSelectHandler(pTitle2ElementMap) {
  /** @type {string} */
  var currentHighlightedTitle = "";

  /** @param {MouseEvent} pMouseEvent */
  return function selectHighlightHandler(pMouseEvent) {
    pMouseEvent.preventDefault();

    var closestNodeOrEdge = pMouseEvent.target.closest(".edge, .node");
    var closestTitleText = getTitleText(closestNodeOrEdge);

    if (closestNodeOrEdge) {
      gMode.setToSelect();
    } else {
      gMode.setToHover();
    }
    if (currentHighlightedTitle !== closestTitleText) {
      resetNodesAndEdges();
      addHighlight(closestNodeOrEdge);
      pTitle2ElementMap.get(closestTitleText).forEach(addHighlight);
      currentHighlightedTitle = closestTitleText;
    }
  };
}
function Mode() {
  var HOVER = 1;
  var SELECT = 2;

  function setToHover() {
    this._mode = HOVER;
  }
  function setToSelect() {
    this._mode = SELECT;
  }

  /**
   * @returns {number}
   */
  function get() {
    return this._mode || HOVER;
  }

  return {
    HOVER: HOVER,
    SELECT: SELECT,
    setToHover: setToHover,
    setToSelect: setToSelect,
    get: get,
  };
}

/**
 *
 * @param {SVGGelement[]} pEdges
 * @param {SVGGElement[]} pNodes
 * @return {{get: (pTitleText:string) => SVGGElement[]}}
 */
function Title2ElementMap(pEdges, pNodes) {
  /* {{[key: string]: SVGGElement[]}} */
  var elementMap = buildMap(pEdges, pNodes);

  /**
   * @param {NodeListOf<SVGGElement>} pEdges
   * @param {NodeListOf<SVGGElement>} pNodes
   * @return {{[key: string]: SVGGElement[]}}
   */
  function buildMap(pEdges, pNodes) {
    var title2NodeMap = buildTitle2NodeMap(pNodes);

    return nodeListToArray(pEdges).reduce(addEdgeToMap(title2NodeMap), {});
  }
  /**
   * @param {NodeListOf<SVGGElement>} pNodes
   * @return {{[key: string]: SVGGElement}}
   */
  function buildTitle2NodeMap(pNodes) {
    return nodeListToArray(pNodes).reduce(addNodeToMap, {});
  }

  function addNodeToMap(pMap, pNode) {
    var titleText = getTitleText(pNode);

    if (titleText) {
      pMap[titleText] = pNode;
    }
    return pMap;
  }

  function addEdgeToMap(pNodeMap) {
    return function (pEdgeMap, pEdge) {
      /** @type {string} */
      var titleText = getTitleText(pEdge);

      if (titleText) {
        var edge = pryEdgeFromTitle(titleText);

        pEdgeMap[titleText] = [pNodeMap[edge.from], pNodeMap[edge.to]];
        (pEdgeMap[edge.from] || (pEdgeMap[edge.from] = [])).push(pEdge);
        (pEdgeMap[edge.to] || (pEdgeMap[edge.to] = [])).push(pEdge);
      }
      return pEdgeMap;
    };
  }

  /**
   *
   * @param {string} pString
   * @return {{from?: string; to?:string;}}
   */
  function pryEdgeFromTitle(pString) {
    var nodeNames = pString.split(/\s*->\s*/);

    return {
      from: nodeNames.shift(),
      to: nodeNames.shift(),
    };
  }
  /**
   *
   * @param {string} pTitleText
   * @return {SVGGElement[]}
   */
  function get(pTitleText) {
    return (pTitleText && elementMap[pTitleText]) || [];
  }
  return {
    get: get,
  };
}

/**
 * @param {SVGGElement} pGElement
 * @return {string?}
 */
function getTitleText(pGElement) {
  /** @type {SVGTitleElement} */
  var title = pGElement && pGElement.querySelector("title");
  /** @type {string} */
  var titleText = title && title.textContent;

  if (titleText) {
    titleText = titleText.trim();
  }
  return titleText;
}

/**
 * @param {NodeListOf<Element>} pNodeList
 * @return {Element[]}
 */
function nodeListToArray(pNodeList) {
  var lReturnValue = [];

  pNodeList.forEach(function (pElement) {
    lReturnValue.push(pElement);
  });

  return lReturnValue;
}

function resetNodesAndEdges() {
  nodeListToArray(document.querySelectorAll(".current")).forEach(
    removeHighlight,
  );
}

/**
 * @param {SVGGElement} pGElement
 */
function removeHighlight(pGElement) {
  if (pGElement && pGElement.classList) {
    pGElement.classList.remove("current");
  }
}

/**
 * @param {SVGGElement} pGroup
 */
function addHighlight(pGroup) {
  if (pGroup && pGroup.classList) {
    pGroup.classList.add("current");
  }
}

var gHints = {
  HIDDEN: 1,
  SHOWN: 2,
  state: 1, // === HIDDEN
  show: function () {
    document.getElementById("hints").removeAttribute("style");
    gHints.state = gHints.SHOWN;
  },
  hide: function () {
    document.getElementById("hints").style = "display:none";
    gHints.state = gHints.HIDDEN;
  },
  toggle: function () {
    if ((gHints.state || gHints.HIDDEN) === gHints.HIDDEN) {
      gHints.show();
    } else {
      gHints.hide();
    }
  },
};

/** @param {KeyboardEvent} pKeyboardEvent */
function keyboardEventHandler(pKeyboardEvent) {
  if (pKeyboardEvent.key === "Escape") {
    resetNodesAndEdges();
    gMode.setToHover();
    gHints.hide();
  }
  if (pKeyboardEvent.key === "F1") {
    pKeyboardEvent.preventDefault();
    gHints.toggle();
  }
}

document.addEventListener("contextmenu", getSelectHandler(title2ElementMap));
document.addEventListener("mouseover", getHoverHandler(title2ElementMap));
document.addEventListener("keydown", keyboardEventHandler);
document.getElementById("close-hints").addEventListener("click", gHints.hide);
document.getElementById("button_help").addEventListener("click", gHints.toggle);
document.querySelector("svg").insertAdjacentHTML(
  "afterbegin",
  `<linearGradient id="edgeGradient">
      <stop offset="0%" stop-color="fuchsia"/>
      <stop offset="100%" stop-color="purple"/>
   </linearGradient>
  `,
);

// Add a small increment to the last value of the path to make gradients on
// horizontal paths work. Without them all browsers I tested with (firefox,
// chrome) do not render the gradient, but instead make the line transparent
// (or the color of the background, I haven't looked into it that deeply,
// but for the hack it doesn't matter which).
function skewLineABit(lDrawingInstructions) {
  var lLastValue = lDrawingInstructions.match(/(\d+\.?\d*)$/)[0];
  // Smaller values than .001 _should_ work as well, but don't in all
  // cases. Even this value is so small that it is not visible to the
  // human eye (tested with the two I have at my disposal).
  var lIncrement = 0.001;
  var lNewLastValue = parseFloat(lLastValue) + lIncrement;

  return lDrawingInstructions.replace(lLastValue, lNewLastValue);
}

nodeListToArray(document.querySelectorAll("path"))
  .filter(function (pElement) {
    return pElement.parentElement.classList.contains("edge");
  })
  .forEach(function (pElement) {
    pElement.attributes.d.value = skewLineABit(pElement.attributes.d.value);
  });

    </script>
  </body>
</html>
